#include <list>
#include <map>
#include <vector>

#define MACRO(T) f<T>()

class MyClass
{
public:
   std::map < int, bool > someData;
   std::map < int, std::list < bool > > otherData;
};

void foo()
{
   List < byte > bob = new List<byte>();

}

A<B> foo;
A<B,C> bar;
A<B*> baz;
A<B<C> > bay;

void asd(void)
{
   A<B> foo;
   A<B,C> bar;
   A<B*> baz;
   A<B<C> > bay;
   if (a < b && b > c)
   {
      a = b < c > 0;
   }
   if (a < bar() > c)
   {
   }
   a < up_lim() ? do_hi() : do_low;
   a[ a<b> c] = d;
}

template<typename T>
class MyClass
{

}

template<typename T>
class MyClass
{
}

template<typename A, typename B, typename C>
class MyClass : myvar(0),
   myvar2(0)
{

}

template<typename A, typename B, typename C>
class MyClass
   : myvar(0),
   myvar2(0)
{

}


static int max_value()
{
   return (std :: numeric_limits  <int >:: max )();
}

template < class Config_    >
priority_queue < Config_ >   ::   ~priority_queue ()  {

}

template<class T>
T test(T a) {
   return a;
}

int main() {
   int k,j;
   h g<int>;
   k=test<int>(j);
   return 0;
}

template<typename T, template<typename, unsigned int, unsigned int> class ConcreteStorageClass>
class RotationMatrix
   : public StaticBaseMatrix<T, 3, 3, ConcreteStorageClass>
{

public:

   RotationMatrix()
      : StaticBaseMatrix<T, 3, 3, ConcreteStorageClass>()
   {
      // do some initialization
   }

   void assign(const OtherClass<T, 3, 3 >& other)
   {
      // do something
   }

};

int main()
{
   MyClass<double, 3, 3, MyStorage> foo;
}

template< typename CharT, int N, typename Traits >
inline std::basic_ostream<CharT,Traits>& FWStreamOut(std::basic_ostream<CharT,Traits>& os,
                                                     const W::S<CharT,N,Traits>& s)
{
   return operator << <CharT, N, Traits, char, std::char_traits<char> >( os, s );
}

struct foo {
   type1 < int& > bar;
};
struct foo {
   type1 < int const > bar;
};


template <int i>
void f();
template <int i>
void g() {
   f<i - 1>();
   f< i >();
   f<i + 1>();
   f<bar()>();
}
void h() {
   g<42>();
}

#include <vector>
std::vector<int> A(2);
std::vector<int> B;
std::vector<int> C(2);
std::vector<int> D;

template<class T>
struct X { template<class U>
           void operator ()(U); };

template<class T>
class Y { template<class V>
          void f(V); };

void (* foobar)(void) = NULL;
std::vector<void (*)(void)> functions;

#define MACRO( a ) a
template < typename = int >
class X;
MACRO ( void f( X < >& x ) );
void g( X < >& x );

#include <vector>
typedef std::vector<std::vector<int> > Table;  // OK
typedef std::vector<std::vector<bool> > Flags;  // Error

void func(List<B> = default_val1);
void func(List<List<B> > = default_val2);

BLAH<(3.14 >= 42)> blah;
bool X = j<3> > 1;

void foo()
{
   A<(X > Y)> a;
   a = static_cast<List<B> >(ld);
}

template<int i>
class X { /* ... */ };
X < 1 > 2 > x1;    // Syntax error.
X<(1 > 2)> x2;    // Okay.

template<class T>
class Y { /* ... */ };
Y<X<1> > x3;     // Okay, same as "Y<X<1> > x3;".
Y<X<(6 >> 1)> > x4;


template <typename T>
int
myFunc1(typename T::Subtype val);

int
myFunc2(T::Subtype val);
